//package com.liao.filter;
//
//import com.liao.domain.LoginUser;
//
//import com.liao.utils.JwtUtil;
//import com.liao.utils.RedisCache;
//import io.jsonwebtoken.Claims;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.core.Ordered;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//import org.springframework.web.filter.OncePerRequestFilter;
//import org.springframework.web.server.ServerWebExchange;
//import reactor.core.publisher.Mono;
//
//import java.io.IOException;
//import java.util.Objects;
//
///**
// * @author 28580
// * @version 1.0
// * @description: TODO
// * @date 2023/7/21 20:04
// */
//@Component
//public class JwtAuthenticationTokenFilter implements GlobalFilter,Ordered {
//
//    @Autowired
//    private RedisCache redisCache;
//
//
//
//    @Override
//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        // 获取token
//        String token =  exchange.getRequest().getHeaders().getFirst("token");
//        if (!StringUtils.hasText(token)) {
//            // 放行，后面还有其他过滤器
//            return chain.filter(exchange);
//        }
//
//        // 解析token
//        String id;
//        try {
//            Claims claims = JwtUtil.parseJWT(token);
//            id = claims.getSubject();
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new RuntimeException("token非法");
//        }
//
//        // 从redis中获取用户信息
//        String redisKey = "login:" + id;
//        LoginUser loginUser = redisCache.getCacheObject(redisKey);
//        System.out.println(loginUser);
//        if (Objects.isNull(loginUser)) {
//            throw new RuntimeException("用户未登录");
//        }
//
//        // 后面将需要一个Authentication的对象，在这里通过实现类UsernamePasswordAuthenticationToken构造这个对象
//        // 选择3个参数的构造器，principal：账号，credentials：密码，authorities：权限
//        // 为什么要选择这个构造器呢？因为这个构造器中有，super.setAuthenticated(true); 标识用户为已认证。
//        UsernamePasswordAuthenticationToken authenticationToken =
//                new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
//        // 存入SecurityContextHolder
//        // 存入需要一个Authentication的对象，在登录的时候也用到过类似的方法。
//        // TODO 获取权限信息封装到Authentication
//        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//
//        return chain.filter(exchange);
//    }
//
//    @Override
//    public int getOrder() {
//        return 0;
//    }
//}
